<?php

session_start();
require_once '../model/Grupo.php';
require_once '../model/Usuario.php';
require_once '../model/Permissao.php';
require_once '../model/Recurso.php';

class GrupoDLO {

    private $grupos;
    private static $grupoDLO;

    private function __construct() {

    }

    /**
     * @method GrupoController getInstance() para obter uma única instância do controlador
     * @return GrupoDLO
     */
    public static function &getInstance() {
        if (!isset(self::$grupoDLO)) {
            if (!isset($_SESSION['grupoDLO'])) {
                $_SESSION['grupoDLO'] = serialize(new GrupoDLO());
            }
            self::$grupoDLO = unserialize($_SESSION['grupoDLO']);
        }
        return self::$grupoDLO;
    }

    public function cadastrar(&$descricao) {
        $grupo = new Grupo();
        $grupo->setDescricao($descricao);
        $grupo->cadastrar();
    }

    public function &listar() {
        $result = Grupo::listar();
        $resultado = array();
        for ($i = 0; $i < sizeof($result); $i++) {
            $row = array();
            $row['cod_grupo'] = &$result[$i]->getCod_grupo();
            $row['descricao'] = &$result[$i]->getDescricao();
            $resultado[$i] = &$row;
            unset($row);
        }
        return $resultado;
    }

    public function excluir(&$cod_grupo) {
        $grupo = null;
        if (isset($this->grupos[$cod_grupo])) {
            $grupo = &$this->grupos[$cod_grupo];
        } else {
            $grupo = &Grupo::consultar($cod_grupo);
            $this->grupos[$cod_grupo] = &$grupo;
            $_SESSION['grupoDLO'] = serialize($this);
        }
        if ($grupo->isVinculado() == 1) {
            throw new Exception("Recurso vinculado");
        }
        $grupo->excluir();
        unset($this->grupos[$cod_grupo]);
        $_SESSION['grupoDLO'] = serialize($this);
    }

    public function alterar(&$cod_grupo, &$campo_id, &$campo_valor) {
        $grupo = null;
        if (isset($this->grupos[$cod_grupo])) {
            $grupo = &$this->grupos[$cod_grupo];
        } else {
            $grupo = &Grupo::consultar($cod_grupo);
            $this->grupos[$cod_grupo] = &$grupo;
            $_SESSION['grupoDLO'] = serialize($this);
        }
        if ($grupo->isVinculado() == 1) {
            throw new Exception("Recurso vinculado");
        }
        $grupo->alterarCampo($campo_id, $campo_valor);
        $this->grupos[$cod_grupo] = &$grupo;
        $_SESSION['grupoDLO'] = serialize($this);
    }

    public function &consultar(&$cod_grupo) {
        $grupo = null;
        if (isset($this->grupos[$cod_grupo])) {
            $grupo = &$this->grupos[$cod_grupo];
        } else {
            $grupo = &Grupo::consultar($cod_grupo);
            $this->grupos[$cod_grupo] = &$grupo;
            $_SESSION['grupoDLO'] = serialize($this);
        }
        $row['cod_grupo'] = &$grupo->getCod_grupo();
        $row['descricao'] = &$grupo->getDescricao();
        $row['vinculado'] = &$grupo->isVinculado();
        /* $usuarios = &$grupo->listarUsuarios();
          $resultUsuarios = array();
          for ($i = 0; $i < sizeof($usuarios); $i++) {
          $rowUsuario[] = array();
          $rowUsuario['cod_usuario'] = &$usuarios[$i]->getCod_usuario();
          $rowUsuario['nome'] = &$usuarios[$i]->getNome();
          $rowUsuario['usuario'] = &$usuarios[$i]->getLogin();
          $resultUsuarios[$i] = &$rowUsuario;
          unset ($rowUsuario);
          }
          $row['usuarios'] = &$resultUsuarios;
          $permissoes = &$grupo->listarPermissoes();
          $resultPermissoes = array();
          for ($i = 0; $i < sizeof($permissoes); $i++) {
          $rowPermissao[] = array();
          $rowPermissao['cod_permissao'] = &$permissoes[$i]->getCod_permissao();
          $rowPermissao['alteracao'] = &$permissoes[$i]->getAlteracao();
          $rowPermissao['consulta'] = &$permissoes[$i]->getConsulta();
          $rowPermissao['exclusao'] = &$permissoes[$i]->getExclusao();
          $rowPermissao['inclusao'] = &$permissoes[$i]->getInclusao();
          $recurso = &$permissoes[$i]->getRecurso();
          $rowRecurso = array();
          $rowRecurso['cod_recurso'] = &$recurso->getCod_recurso();
          $rowRecurso['descricao'] = &$recurso->getDescricao();
          $rowPermissao['recurso'] = &$rowRecurso;
          $resultPermissoes[$i] = &$rowPermissao;
          unset ($rowRecurso);
          unset ($rowPermissao);
          }
          $row['permissoes'] = &$resultPermissoes; */
        return $row;
    }

    public function &listarUsuarios(&$cod_grupo) {
        $grupo = null;
        if (isset($this->grupos[$cod_grupo])) {
            $grupo = &$this->grupos[$cod_grupo];
        } else {
            $grupo = &Grupo::consultar($cod_grupo);
            $this->grupos[$cod_grupo] = &$grupo;
            $_SESSION['grupoDLO'] = serialize($this);
        }
        $usuarios = &$grupo->listarUsuarios();
        $resultUsuarios = array();
        foreach ($usuarios as $usuario) {
            $rowUsuario[] = array();
            $rowUsuario['cod_usuario'] = &$usuario->getCod_usuario();
            $rowUsuario['nome'] = &$usuario->getNome();
            $rowUsuario['login'] = &$usuario->getLogin();
            $rowUsuario['email'] = &$usuario->getEmail();
            $resultUsuarios[] = &$rowUsuario;
            unset($rowUsuario);
        }
        return $resultUsuarios;
    }

    public function &listarPermissoes(&$cod_grupo) {
        $grupo = null;
        if (isset($this->grupos[$cod_grupo])) {
            $grupo = &$this->grupos[$cod_grupo];
        } else {
            $grupo = &Grupo::consultar($cod_grupo);
            $this->grupos[$cod_grupo] = &$grupo;
            $_SESSION['grupoDLO'] = serialize($this);
        }
        $permissoes = &$grupo->listarPermissoes();
        $resultPermissoes;
        foreach ($permissoes as $permissao) {
            $rowPermissao['cod_permissao'] = &$permissao->getCod_permissao();
            $rowPermissao['alteracao'] = &$permissao->getAlteracao();
            $rowPermissao['consulta'] = &$permissao->getConsulta();
            $rowPermissao['exclusao'] = &$permissao->getExclusao();
            $rowPermissao['inclusao'] = &$permissao->getInclusao();
            $recurso = &$permissao->getRecurso();
            $rowRecurso['cod_recurso'] = &$recurso->getCod_recurso();
            $rowRecurso['descricao'] = &$recurso->getDescricao();
            $rowPermissao['recurso'] = &$rowRecurso;
            $resultPermissoes[] = &$rowPermissao;
            unset($rowRecurso);
            unset($rowPermissao);
        }
        return $resultPermissoes;
    }

    public function cadastrarUsuario(&$cod_grupo, &$nome, &$usuario, &$senha, &$email) {
        $grupo = null;
        if (isset($this->grupos[$cod_grupo])) {
            $grupo = &$this->grupos[$cod_grupo];
        } else {
            $grupo = &Grupo::consultar($cod_grupo);
            $this->grupos[$cod_grupo] = &$grupo;
            $_SESSION['grupoDLO'] = serialize($this);
        }

        $this->grupos[$cod_grupo]->cadastrarUsuario($nome, $usuario, $senha, $email);
        $_SESSION['grupoDLO'] = serialize($this);
    }

    public function alterarUsuario(&$cod_grupo, &$cod_usuario, &$campo_id, &$campo_valor) {
        $grupo = null;
        if (isset($this->grupos[$cod_grupo])) {
            $grupo = &$this->grupos[$cod_grupo];
        } else {
            $grupo = &Grupo::consultar($cod_grupo);
            $this->grupos[$cod_grupo] = &$grupo;
            $_SESSION['grupoDLO'] = serialize($this);
        }
        $this->grupos[$cod_grupo]->alterarUsuario($cod_usuario, $campo_id, $campo_valor);
        $_SESSION['grupoDLO'] = serialize($this);
    }

    public function excluirUsuario(&$cod_grupo, &$cod_usuario) {
        $grupo = null;
        if (isset($this->grupos[$cod_grupo])) {
            $grupo = &$this->grupos[$cod_grupo];
        } else {
            $grupo = &Grupo::consultar($cod_grupo);
            $this->grupos[$cod_grupo] = &$grupo;
            $_SESSION['grupoDLO'] = serialize($this);
        }
        $this->grupos[$cod_grupo]->excluirUsuario($cod_usuario);
        $_SESSION['grupoDLO'] = serialize($this);
    }

    public function &consultarUsuario(&$cod_grupo, &$cod_usuario) {
        $grupo = null;
        if (isset($this->grupos[$cod_grupo])) {
            $grupo = &$this->grupos[$cod_grupo];
        } else {
            $grupo = &Grupo::consultar($cod_grupo);
            $this->grupos[$cod_grupo] = &$grupo;
            $_SESSION['grupoDLO'] = serialize($this);
        }
        $usuario = &$this->grupos[$cod_grupo]->getLogin($cod_usuario);
        $row[] = array();
        $row['cod_usuario'] = &$usuario->getCod_usuario();
        $row['nome'] = &$usuario->getNome();
        $row['login'] = &$usuario->getLogin();
        $row['email'] = &$usuario->getEmail();
        return $row;
    }

    public function cadastrarPermissao(&$cod_grupo, &$consulta, &$inclusao, &$alteracao, &$exclusao, &$cod_recurso) {
        $grupo = null;
        if (isset($this->grupos[$cod_grupo])) {
            $grupo = &$this->grupos[$cod_grupo];
        } else {
            $grupo = &Grupo::consultar($cod_grupo);
            $this->grupos[$cod_grupo] = &$grupo;
            $_SESSION['grupoDLO'] = serialize($this);
        }
        $this->grupos[$cod_grupo]->cadastrarPermissao($consulta, $inclusao, $alteracao, $exclusao, Recurso::consultar($cod_recurso));
        $_SESSION['grupoDLO'] = serialize($this);
    }

    public function alterarPermissao(&$cod_grupo, &$cod_permissao, &$campo_id, &$campo_valor) {
        $grupo = null;
        if (isset($this->grupos[$cod_grupo])) {
            $grupo = &$this->grupos[$cod_grupo];
        } else {
            $grupo = &Grupo::consultar($cod_grupo);
            $this->grupos[$cod_grupo] = &$grupo;
            $_SESSION['grupoDLO'] = serialize($this);
        }
        $this->grupos[$cod_grupo]->alterarPermissao($cod_permissao, $campo_id, $campo_valor);
        $_SESSION['grupoDLO'] = serialize($this);
    }

    public function &consultarPermissao(&$cod_grupo, &$recurso) {
        $grupo = null;
        if (isset($this->grupos[$cod_grupo])) {
            $grupo = &$this->grupos[$cod_grupo];
        } else {
            $grupo = &Grupo::consultar($cod_grupo);
            $this->grupos[$cod_grupo] = &$grupo;
            $_SESSION['grupoDLO'] = serialize($this);
        }
        $permissao = &$this->grupos[$cod_grupo]->getPermissao($recurso);
        $row = array();
        if (is_null($permissao)) {
            $row['alteracao'] = 'N';
            $row['consulta'] = 'N';
            $row['exclusao'] = 'N';
            $row['inclusao'] = 'N';
        } else {
            $row['cod_permissao'] = &$permissao->getCod_permissao();
            $row['alteracao'] = &$permissao->getAlteracao();
            $row['consulta'] = &$permissao->getConsulta();
            $row['exclusao'] = &$permissao->getExclusao();
            $row['inclusao'] = &$permissao->getInclusao();
        }
        return $row;
    }

    public function excluirPermissao(&$cod_grupo, &$cod_permissao) {
        $grupo = null;
        if (isset($this->grupos[$cod_grupo])) {
            $grupo = &$this->grupos[$cod_grupo];
        } else {
            $grupo = &Grupo::consultar($cod_grupo);
            $this->grupos[$cod_grupo] = &$grupo;
            $_SESSION['grupoDLO'] = serialize($this);
        }
        $this->grupos[$cod_grupo]->excluirPermissao($cod_permissao);
        $_SESSION['grupoDLO'] = serialize($this);
    }

}
?>